package com.llxjr.demo.patten.singleton;

/**
 * @author liulz
 * @date 2021/1/11 9:15
 */
public class Singleton {
    /* 持有私有静态实例，防止被引用，此处赋值为null，目的是实现延迟加载 */
    private static Singleton instance = null;

    private static class SingletonFactory {
        private static Singleton instance = new Singleton();
    }

    /* 此处使用一个内部类来维护单例，代替被注释掉的getInstance() */
    public static Singleton getInstance(){
        return SingletonFactory.instance;
    }

    /* 私有构造方法，防止被实例化 */
    public Singleton() {
    }

    /** 静态工程方法，创建实例
     * 单线程下只需要
     *
     * //                if (instance == null) {
     * //                    instance = new Singleton();
     * //                }
     *
     * 加线程保护
     * 对getInstance方法加synchronized关键字
     *
     * public static synchronized Singleton getInstance() {
     *
     * 在性能上会有所下降。事实上，只有在第一次创建对象的时候需要加锁，之后就不需要了
     * 改进如下
     *
    **/
//    public static Singleton getInstance(){
//        if (instance == null){
//            synchronized (instance){
//                if (instance == null) {
//                    instance = new Singleton();
//                }
//            }
//        }
//        return instance;
//    }



    /* 如果该对象被用于序列化，可以保证对象在序列化前后保持一致 */
    public Object readResolve(){
        return instance;
    }

    public static String stringOut(){
        System.out.println("创建了单例模式");
        return "success";
    }
}
